package com.qjc.demo.algorithm.滑动窗口219存在重复元素2;

import java.util.HashSet;
import java.util.Set;

/**
 * 滑动窗口：窗口最大为k，其中r-l<=k，把窗口中的元素保存到集合中，
 * 每次左右指针移动更新集合即可，如果集合中存在元素则返回true
 *
 * @ClassName: Solution
 * @Author: qjc
 * @Date: 2023/8/15 15:01
 */
public class Solution {
    // 存在重复元素
    public static boolean containsNearbyDuplicate(int[] nums, int k) {
        // 定义集合，其实就是窗口内的所有元素
        Set<Integer> set = new HashSet<>();
        for (int l = 0, r = 0; r < nums.length; r++) {
            // 如果集合中存在的元素则直接返回true
            if (set.contains(nums[r])) {
                return true;
            }
            set.add(nums[r]);
            // 如果窗口大，则缩小窗口，同时将左边的元素删除掉（及集合也要跟着缩小）
            while (r - l >= k) {
                set.remove(nums[l]);
                l++;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5, 6, 2, 7, 8, 9};
        int k = 5;
        System.out.println(containsNearbyDuplicate(nums, k));
    }

}
